<?php
class Arfolyam extends AppModel {

	var $name = 'Arfolyam';
	
	var $belongsTo = array(
			'Valuta' => array('className' => 'Valuta',
								'foreignKey' => 'valuta_id',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			)
		);
	
/**
 * MNB deviza árfolyamok lekérdezése netről illetve AB-ból
 *
 * @param string $valuta valuta MNB rövidítések vesszővel elválasztva
 * @return array valutanemek és árfolyamok a kérdezett napra
 * //TODO: Ez itten nem egészséges MVC megoldás
 */
	function getArfolyam($valuta = 'EUR,USD,GBP,CHF,RON,SEK,NOK,DKK,INR'){
		//ha a legfrisebb árfolyam még nincs bent az adatbázisban lekérjük a webről
		$valutaIdk = $this->Valuta->find(
					'all',
					array(
						'conditions' => array('nev' => explode(',', $valuta)),
						'recursive' => -1
					)
					);
		//debug($valutaIdk);
		foreach($valutaIdk as $i => $v){
			$valutaIdk[$v['Valuta']['nev']] = $v['Valuta']['id'];
			unset($valutaIdk[$i]);
		}
//debug($valutaIdk);
		$valutak = $this->_getArfolyamFromDB($valutaIdk, date('Y-m-d'));
		if(count($valutak) != count($valutaIdk)){	//ha nem szerepel még az AB-ban
			//lekérés az MNB-től
			App::import('Vendor', 'nusoap', array('file' => 'nusoap' . DS . 'nusoap.php'));
			$client = new nusoap_client('http://www.mnb.hu/arfolyamok.asmx?WSDL', 'wsdl', '', '', '', '');
			$error = $client->getError();

			$param = array('startDate' => date('Y-m-d'), 'endDate' => date('Y-m-d'), 'currencyNames' => $valuta);
			$result = $client->call('GetExchangeRates', array('parameters' => $param), '', '', false, true);
			//debug($result);
			if ($client->fault)
				$error = $result;
			else
				$error = $client->getError();
			//debug($error);
			if(!$error){	//árfolyamok lekérdezése nem adott vissza hibát
				$rates = new nusoap_parser($result['GetExchangeRatesResult']);
				//debug($rates);
				$rates = $rates->message;
				/*Array
				(
			    [Rate] => Array
			        (
			            [0] => Array
			                (
			                    [!curr] => EUR
			                    [!unit] => 1
			                    [!] => 300.21
			                )
			            [1] => Array
			                (
			                    [!curr] => GBP
			                    [!unit] => 1
			                    [!] => 335.48
			                )
			            [2] => Array
			                (
			                    [!curr] => USD
			                    [!unit] => 1
			                    [!] => 235.03
			                )
					)
				 [!date] => 2009-02-26
				 )
				*/
				if(isset($rates[1])){
					//megvannak az árfolyamok lehet őket AB-ba nyomatni
					$valutak = $arfolyamok = array();
					if(!$rates[1]['result']['Rate'][0])	//ha csak egy devizát kérdezünk le át kell alakítani a tömböt
						$rates[1]['result']['Rate'][0] = $rates[1]['result']['Rate'];
					$index = 0;
					foreach($rates[1]['result']['Rate'] as $i => $rate){
						if(is_numeric($i)){
							$valutak[$valutaIdk[$rate['!curr']]] = array(
													'valuta_id' => $valutaIdk[$rate['!curr']],
													'nev' => $rate['!curr'],
													'arfolyam' => str_replace(',', '.', $rate['!']),
													'datum' => date('Y-m-d')
													);
							$arf[$index] = $valutak[$valutaIdk[$rate['!curr']]];
							$index++;
						}
					}
					//debug($arf);
					//debug($valutak);
					$this->saveAll($arf);
				}
				else{
					//nincs $rates[1], azaz nem kaptunk se hibaüzenetet se árfolyamokat használjuk a legfrisebb árfolyamot
					$valutak = $this->_getArfolyamFromDB($valutaIdk, date('Y-m-d'), true);
				}
			}
			else{	//van $error nem skierült lekérni az árfolyamokat használjuk az ab-ban meglévő legfrisebbet
				$valutak = $this->_getArfolyamFromDB($valutaIdk, date('Y-m-d'), true);
			}
		}
		//debug($valutak);
		//debug($error);
		return($valutak);
	}
	
/**
 * MNB deviza árfolyamok lekérdezése AB-ból
 *
 * @param array $valutaIdk a valuták ABbeli id-i
 * @param string $nap melyik napra futtassuk a keresést
 * @param bool $visszalep true esetén ha a keresett napra nincs rekord, akkor visszalép addig amíg nem talál rekordot
 * @return array valuták és árfolyamok a kérdezett napra
 */
	function _getArfolyamFromDB($valutaIdk, $nap, $visszalep = false){
		$visszalep = $visszalep ? ' <=' : '=';
		$this->query('CREATE TEMPORARY TABLE IF NOT EXISTS `t`
						SELECT `Arfolyam`.`valuta_id`, MAX(`Arfolyam`.`datum`)
						FROM `arfolyamok` AS `Arfolyam` GROUP BY `Arfolyam`.`valuta_id`');
		$sql = 'SELECT `Arfolyam`.`valuta_id`, `Valuta`.`id`, `Valuta`.`nev`, `Arfolyam`.`arfolyam`, `Arfolyam`.`datum`
					FROM `arfolyamok` AS `Arfolyam`
					LEFT JOIN `valutak` AS `Valuta` ON (`Arfolyam`.`valuta_id` = `Valuta`.`id`)
					WHERE valuta_id IN ('.implode(', ', $valutaIdk).') AND `datum` '.$visszalep.' "'.$nap.'" AND (Arfolyam.valuta_id, Arfolyam.datum) IN (SELECT * FROM t)
					GROUP BY `Valuta`.`nev`
					ORDER BY `Valuta`.`nev`';
		$arfolyamok = $this->query($sql);
//		debug($arfolyamok);
		$valutak = array();
		if(count($arfolyamok)){
			foreach($arfolyamok as $a){
				$valutak[$a['Valuta']['id']] = array(
															'valuta_id' => $a['Arfolyam']['valuta_id'],
															'nev' => $a['Valuta']['nev'],
															'arfolyam' => $a['Arfolyam']['arfolyam'],
															'datum' => $a['Arfolyam']['datum'],
															);
			}
		}
		return($valutak);
	}

}
?>